package com.ssm.controller;

import com.ssm.entity.Course;
import com.ssm.service.CourseService;
import com.ssm.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;
import java.util.List;

/**
 * 课程管理控制器
 * 【SpringMVC: 控制器】
 * 使用@RestController和@RequestMapping实现REST风格的API
 */
@RestController
@RequestMapping("/api/courses")
public class CourseController {

    /**
     * 【Spring: IOC依赖注入】
     * 使用@Autowired注解实现依赖注入
     */
    @Autowired
    private CourseService courseService;

    /**
     * 获取所有课程
     * 【SpringMVC: 请求映射】
     * 使用@GetMapping注解映射GET请求
     * 【Spring Boot: 缓存使用】
     * 使用@Cacheable注解实现方法结果的缓存
     * @return 课程列表
     */
    @GetMapping
    @Cacheable(value = "courseList", key = "'all'")
    public Result<List<Course>> getAllCourses() {
        List<Course> courses = courseService.findAll();
        return Result.success(courses);
    }

    /**
     * 根据ID获取课程
     * 【SpringMVC: 路径变量】
     * 使用@PathVariable注解获取路径变量
     * 【Spring Boot: 缓存使用】
     * @param id 课程ID
     * @return 课程信息
     */
    @GetMapping("/{id}")
    @Cacheable(value = "course", key = "#id")
    public Result<Course> getCourseById(@PathVariable Integer id) {
        Course course = courseService.findById(id);
        if (course != null) {
            return Result.success(course);
        } else {
            return Result.fail("课程不存在");
        }
    }

    /**
     * 添加课程
     * 【SpringMVC: 请求体】
     * 使用@RequestBody注解接收请求体
     * 【SpringMVC: 数据校验】
     * 使用@Valid注解进行数据校验
     * 【Spring Boot: 缓存清除】
     * 使用@CacheEvict注解清除缓存
     * @param course 课程信息
     * @return 添加结果
     */
    @PostMapping
    @CacheEvict(value = {"courseList", "course"}, allEntries = true)
    public Result<Course> addCourse(@Valid @RequestBody Course course) {
        boolean success = courseService.add(course);
        if (success) {
            return Result.success(course);
        } else {
            return Result.fail("添加课程失败");
        }
    }

    /**
     * 更新课程
     * 【SpringMVC: RESTful API】
     * 使用PUT方法更新资源
     * 【Spring Boot: 缓存清除】
     * @param id 课程ID
     * @param course 课程信息
     * @return 更新结果
     */
    @PutMapping("/{id}")
    @CacheEvict(value = {"courseList", "course"}, allEntries = true)
    public Result<Course> updateCourse(@PathVariable Integer id, @Valid @RequestBody Course course) {
        course.setCourseId(id);
        boolean success = courseService.update(course);
        if (success) {
            return Result.success(course);
        } else {
            return Result.fail("更新课程失败");
        }
    }

    /**
     * 删除课程
     * 【SpringMVC: RESTful API】
     * 使用DELETE方法删除资源
     * 【Spring Boot: 缓存清除】
     * @param id 课程ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @CacheEvict(value = {"courseList", "course"}, allEntries = true)
    public Result<Void> deleteCourse(@PathVariable Integer id) {
        boolean success = courseService.delete(id);
        if (success) {
            return Result.success();
        } else {
            return Result.fail("删除课程失败");
        }
    }

    /**
     * 根据教师名称查询课程
     * 【SpringMVC: RESTful API】
     * 使用路径变量实现资源过滤
     * 【Spring Boot: 缓存使用】
     * @param teacherName 教师名称
     * @return 课程列表
     */
    @GetMapping("/teacher/{teacherName}")
    @Cacheable(value = "courseList", key = "'teacher:' + #teacherName")
    public Result<List<Course>> getCoursesByTeacher(@PathVariable String teacherName) {
        List<Course> courses = courseService.findByTeacherName(teacherName);
        return Result.success(courses);
    }
} 